package com.gitee.l0km.beanfilter.core;

import java.util.BitSet;

/**
 * 定义过滤适用的编解码目标范围
 * @author guyadong
 *
 */
public enum CodecScope {
	/** 无 */NONE(0b000),
	/** 所有目标 */ALL(0b111),
	/** 仅用于 thrift struct 编码解码 */THRIFT(0b100),
	/** 仅用于 jackson和fastjson 编码解码 */JSON(0b011),
	/** 仅用于 jackson 编码解码 */JACKSON(0b010),
	/** 仅用于 fastjson 编码解码 */FASTJSON(0b001);
	private final BitSet bitSet;
	private CodecScope(int bit) {
		this.bitSet = BitSet.valueOf(new byte[] {(byte)bit});
	}
	public boolean singleScope() {
		return bitSet.cardinality()==1;
	}
	/**
	 * 判断目标 {@code CodecScope} 枚举变量的目标范围是否匹配当前枚举变量要求的范围
	 * @param target
	 */
	public boolean match(CodecScope target) {
		if(null == target) {
			return false;
		}
		for(int i = bitSet.length();(i = bitSet.previousSetBit(i-1)) >= 0;) {
			if(!target.bitSet.get(i)) {
				return false;
			}
		}
		return true;
	}
	/** 是否用于 thrift struct 编码解码 */
	public boolean thriftUsed() {
		return bitSet.get(2);
	}
	/** 是否用于 jackson 编码解码 */
	public boolean jacksonUsed(){
		return bitSet.get(1);
	}
	/** 是否用于 fastjson 编码解码 */
	public boolean fastjsonUsed(){
		return bitSet.get(0);
	}
}
